﻿using System;
using System.Collections;
using System.Linq;
using System.Text;


namespace ConsoleApplication1
{
class ReglaDocumentarMetodo : Regla
    {

        public ReglaDocumentarMetodo()
        {
        }

        override public Resultado Aplicar(ArrayList archivo)
        {
            try
            {
                return regla_verificarMetodoComentario(archivo);
            }
            catch (Exception e)
            {
                return null;
            }

        }

        public static Resultado regla_verificarMetodoComentario(ArrayList archivo)
        //Que todos los metodos del archivo tengan almenos un comentario
        {
            //variables iniciales
            int AnchoLinea; //Almacena el tamaño de cada linea del archivo.
            int i = 0;     //contador de iteraciones para los ciclos(for).   
            int LineaActual = 0; //lineaactual que se esta leyendo.
            Resultado resp = new Resultado();//inicializo el objeto que sera retonado
            int contLLaves = 0; //contador que sirve para saber cuando se termina un metodo.
            bool esMetodo = false; //Auxiliar para saber si estamos en un metodo o no.
            bool comentario = false;


            //se inicializa resp asumiendo que la regla se cumple
            resp.Fecha = new DateTime();
            resp.Fecha = DateTime.Now;
            resp.Respuesta = true;
            resp.Mensaje = "Todos los metodos estan documentados correctamente";
            resp.Linea = LineaActual;

            try
            {
                foreach (String linea in archivo)   //Recorro la lista linea por linea
                {
                    LineaActual++;                  //Aumenta el contador de la linea.
                    if (linea.Contains("private") == true || linea.Contains("public") == true || linea.Contains("protected") == true)
                    { //Checkeamos que se esta declarando algo
                        if (linea.Contains("(") == true && linea.Contains(")") == true && linea.Contains("=") != true)
                        {
                            esMetodo = true;
                        }
                    }
                    if (esMetodo == true)
                    {
                        if (linea.Contains("//") == true || linea.Contains("/*") == true)
                        {
                            comentario = true;
                        }
                        if(linea.Contains("{") == true)
                            contLLaves++;
                        if (linea.Contains("}") == true){
                            contLLaves--;
                            if (contLLaves == 0)
                            {
                                esMetodo = false;
                                if (comentario == false)
                                {
                                    resp.Linea = LineaActual;
                                    resp.Respuesta = false;
                                    resp.Mensaje = "Existe un metodo no documentado";
                                    return resp;
                                }
                                else
                                {
                                    comentario = false;
                                }
                            }
                        }
                            


                       
                    }
                }
                return resp;
            }
            catch (Exception e)
            {
                resp.Linea = LineaActual;
                resp.Respuesta = false;
                resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return resp;
            }
        }

    }
}

